#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>


typedef void (*func_t)();

#define NUM 5

func_t handlers[NUM+1];


void DownLoad()
{
    printf("mission download\n");
}

void Flush()
{
    printf("mission flush\n");
}

void Log()
{
    printf("mission log\n");
}

void registerhandlers(func_t h[],func_t f)
{
    int i=0;
    for(i=0;i<NUM;i++)
    {
        if(h[i]==NULL)
        {
            break;
        }
    }

    if(i==NUM)
    {
        return ;
    }

    h[i]=f;
    h[i+1]=NULL;
}

int main()
{

    registerhandlers(handlers,DownLoad);

    registerhandlers(handlers,Flush);
    registerhandlers(handlers,Log);
    pid_t id=fork();

    if(id==0)
    {
        int count=3;
        while(1)
        {
            printf("子进程,pid:%d,ppid:%d\n",getpid(),getppid());
            sleep(1);
            count--;

           // int* p=0;
           // *p=10;
           
            //bint a=10;
           // a/=0;
        }

        exit(10);
    }


    while(1)
    {
        int status =0;
        pid_t rid=waitpid(id,&status,WNOHANG);

        if(rid>0)
        {
            printf("wait success rid:%d,exit code:%d,exit singal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
            break;
        }
        else if(rid==0)
        {
            int i=0;
            for(i=0;handlers[i];i++)
            {
                handlers[i]();
            }

            printf("本轮调用结束，子进程还未退出\n");
            sleep(1);
        }
        else 
        {
            printf("等待失败\n");
        }
    }

    //sleep(10);
    //int status=0;
    //pid_t rid=waitpid(id,&status,0);

    //if(rid>0)
    //{
    //    if(WIFEXITED(status))
    //    {
    //      // printf("wait success rid:%d,exit code:%d,exit singal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
    //      
    //       printf("wait success rid:%d,exit code:%d,exit singal:%d\n",rid,WEXITSTATUS(status),status&0x7F);
    //    }
    //    else 
    //    {
    //        printf("进程异常退出\n");
    //    }
    //}
    //else 
    //{
    //    printf("wait failed,%d: %s\n",errno,strerror(errno));
    //}
    //sleep(10);

    return 0;
}

//void func()
//{
//    printf("begin\n");
//    exit(23);
//    printf("end\n");
//}
//
//int main()
//{
//
//   printf("hello world");
//
//   sleep(2);
//
//   _exit(23);
//
//   // func();
//   // printf("main\n");
//   // 
//
//    //int i=0;
//    //for(i=0;i<200;i++)
//    //{
//    //    printf("%d -> %s\n",i,strerror(i));
//    //}
//
//    //FILE* fp=fopen("log.txt","r");
//    //if(fp==NULL)
//    //{
//    //    return errno;
//    //}
//
//    //fclose(fp);
//
//    return 0;
//}
